module Servicio
  require File.dirname(__FILE__) + '/conf/accesos'
  
  def self.iniciar
      self.imq_start
      system("echo Iniciando la aplicación...")
      system("echo 1 > /proc/sys/net/ipv4/ip_forward")
      system("#{disc} #{eth} root handle 1: htb default 100")
      system("#{clas} #{eth} parent 1: classid 1:1 htb rate #{disp} ceil #{disp}")
      
      system("#{clas} #{eth} parent 1:1 classid 1:100 htb rate 100mbps ceil 100mbps ")
      system("#{disc} #{eth} parent 1:100 handle 100: esfq perturb 5 hash src") 
      
      for ip in Cliente.find(:all, :conditions => ["activo = ?", true])
        puts "echo Configurando Ancho Banda para #{ip.nombre}"
          system("#{clas} #{eth} parent 1:1 classid 1:#{ip.id+200} htb rate #{ip.anchob.disponible}kbit ceil #{(ip.anchob.disponible)}kbit ")
          system("#{disc} #{eth} parent 1:#{ip.id+200} handle #{ip.id+200}: esfq perturb 5 hash src")
          ####   IPTABLES
          system("#{filt} #{eth} #{u32} #{ips} dst #{ip.ip} flowid 1:#{ip.id+200}")
          #### Habilitando el squid para el ip
          system("iptables -t nat -A PREROUTING -s #{ip.ip} -p tcp --dport 80 -j DNAT --to #{ip.acelerador.direccion}:#{ip.acelerador.puerto}")
          #### Habilitando salida hacia el internet
          system("iptables -t nat -A POSTROUTING -s #{ip.ip} -j SNAT --to #{ip.gateway.pasarela} ")
        puts "==============================="
      end   
  end
  
  
  
  def self.detener
      self.imq_stop
      system("echo Deteniendo la aplicación")
            
      for ip in Cliente.find(:all, :conditions => ["activo = ?", true])
          #### Quitando salida hacia el internet
          system("iptables -t nat -D POSTROUTING -s #{ip.ip} -j SNAT --to #{ip.gateway.pasarela} ")
          #### Quitando el squid para el ip
          system("iptables -t nat -D PREROUTING -s #{ip.ip} -p tcp --dport 80 -j DNAT --to #{ip.acelerador.direccion}:#{ip.acelerador.puerto}")      
          # Quitando asosiación de marcas con clases
          system("tc filter add dev #{eth} protocol ip parent 1: handle #{ip.id+200} fw classid 1:#{ip.id+200}")
          #quitando las colas y las clases
          system("#{discq} #{eth} parent 1:#{ip.id+200} handle #{ip.id+200}: esfq perturb 5 hash src")
          system("#{clasq} #{eth} parent 1:1 classid 1:#{ip.id+200} htb rate #{ip.anchob.disponible}kbit ceil #{(ip.anchob.disponible)}kbit ")
      end  
    
      system("#{discq} #{eth} parent 1:100 handle 100: esfq perturb 5 hash src")   
      system("#{clasq} #{eth} parent 1:1 classid 1:100 htb rate 100mbps ceil 100mbps ")
        
      system("#{discq} #{eth} root handle 1: htb")
      system("#{clasq} #{eth} parent 1: classid 1:1 htb rate #{disp} ceil 1024kbit")
      system("echo 0 > /proc/sys/net/ipv4/ip_forward")
  end
  
  
  
  # Inicia los servicio de la cola intermedia.
  def self.imq_start
    system("ip link set imq0 up")
    system("#{disc} imq0 root handle 1: htb default 1")
    system("#{clas} imq0 parent 1: classid 1:1 htb rate #{disp} ceil #{disp}")
      
     for ip in @cliente = Cliente.find(:all, :conditions => ["activo = ?", true])
         system("#{clas} imq0 parent 1:1 classid 1:#{ip.id+200} htb rate #{ip.anchob.disponible}kbit ceil #{(ip.anchob.disponible)}kbit ")
         system("#{disc} imq0 parent 1:#{ip.id+200} handle #{ip.id+200}: esfq perturb 5 hash src")
         system("#{filt} imq0 #{u32} #{ips} src #{ip.ip} flowid 1:#{ip.id+200}")    
         system("iptables -t mangle -A PREROUTING -i #{eth} -s #{ip.ip} -j IMQ --todev 0")
     end 
  end
  
  # Detiene los servicio de la cola intermedia.
  def self.imq_stop
    for ip in Cliente.find(:all, :conditions => ["activo = ?", true])
       system("iptables -t mangle -D PREROUTING -i #{eth} -s #{ip.ip} -j IMQ --todev 0")
       system("#{filtq} imq0 #{u32} #{ips} src #{ip.ip} flowid 1:#{ip.id+200}")
       system("#{discq} imq0 parent 1:#{ip.id+200} handle #{ip.id+200}: esfq perturb 5 hash src")
       system("#{clasq} imq0 parent 1:1 classid 1:#{ip.id+200} htb rate #{ip.anchob.disponible}kbit ceil #{(ip.anchob.disponible)}kbit ")
    end 
    system("#{clasq} imq0 parent 1: classid 1:1 htb rate #{disp} ceil #{disp}")
    system("#{discq} imq0 root handle 1: htb default 1")
    system("ip link set imq0 down")
  end
  
end